// 执行js脚本
// new Function
// eval

export const performScriptForFunction = (script, appName, global) => {
  // eval(script); // 重复执行死循环的情况 vue react
  // history
  // isTurnChild true 需要更新子应用
  // eval(script);
  // 我们讲过 new Function 运行的这个 script 本来就是一个函数体，所以这里就不需要像下面 eval 那样在定义一个函数体包裹了
  /* const scriptText = `
    ${script}
    return window['${appName}']
  `; */ // 没有使用代理沙箱
  // ()=>{scriptText}
  // 使用代理沙箱
  window.proxy = global;
  const scriptText = `
  return ((window) => {
    ${script}
    return window['${appName}']
  })(window.proxy)
  `;
  // return new Function(scriptText).call(global, global); // 将我们构造函数的 this 指向到 window，然后传入当前的 window 这个对象（示例请看 有道云笔记 ES6 目录）
  return new Function(scriptText)();
};

export const performScriptForEval = (script, appName, global) => {
  // library appName（webpack 打包时设置的 library）window.appName
  // 如何通过 eval 执行我们的脚本来获取到我们的 window.appName
  /* const scriptText = `
    ()=>{
      ${script}
      return window['${appName}']
    }
  `; */ // 没有使用代理沙箱

  // return eval(script); // app module mount
  // 那么这里呢我们需要使用 call 来将我们执行的 scriptText 的this指向到window里
  // return eval(scriptText).call(global, global);

  // 使用代理沙箱
  window.proxy = global;
  const scriptText = `
  ((window) => {
    ${script}
    return window['${appName}']
  })(window.proxy)
  `;
  return eval(scriptText);
};
